﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace CityGames
{
    public partial class FormEventosInscribirSocios : Form
    {
        static private Socio socio = new Socio();
        static private Torneo torneo = new Torneo();
        static private FormContenedor contenedor;

        private int numeroDeSociosPorPagina = 9;
        private int numeroDePaginasMaximoTodos;
        private int numeroDePaginaActualTodos;
        private DataSet dsSociosTodos;

        private int numeroDePaginasMaximoInscritos;
        private int numeroDePaginaActualInscritos;
        private DataSet dsSociosInscritos;

        private int numeroSociosInscritos;
        private int numeroSociosMaximo;

        public FormEventosInscribirSocios()
        {
            InitializeComponent();
        }

        private void bBorrar_Load(object sender, EventArgs e)
        {
            try
            {
                contenedor = (FormContenedor)MdiParent;
                dsSociosTodos = new DataSet();
                dsSociosInscritos = new DataSet();

                numeroDePaginaActualTodos = 1;
                numeroDePaginaActualInscritos = 1;

                numeroSociosInscritos = 0;
                numeroSociosMaximo = 0;

                CargarDataGridViewSociosTodos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void CargarDataGridViewSociosTodos()
        {
            try
            {
                numeroDePaginasMaximoTodos = int.Parse(Math.Ceiling(double.Parse(torneo.ObtenerNumeroDeSociosFiltrados(tbNombreEvento.Text, tbNombreSocio.Text, tbApellidosSocio.Text, tbDNISocio.Text).ToString()) / numeroDeSociosPorPagina).ToString());

                if (numeroDePaginaActualTodos == 0)
                    numeroDePaginaActualTodos = 1;

                if (numeroDePaginaActualTodos > numeroDePaginasMaximoTodos)
                    numeroDePaginaActualTodos = numeroDePaginasMaximoTodos;

                dsSociosTodos = torneo.ObtenerSociosFiltradosPaginados(tbNombreEvento.Text, tbNombreSocio.Text, tbApellidosSocio.Text, tbDNISocio.Text, numeroDeSociosPorPagina * (numeroDePaginaActualTodos - 1), numeroDePaginaActualTodos * numeroDeSociosPorPagina);
                dgvTodos.DataSource = dsSociosTodos;
                dgvTodos.DataMember = "SociosFiltrados";
                lblPaginaDGVTodos.Text = "Página " + numeroDePaginaActualTodos.ToString() + " de " + numeroDePaginasMaximoTodos.ToString();

                if (numeroDePaginaActualTodos <= 1)
                {
                    bDGVTodosPaginaAnterior.Enabled = false;
                    bDGVTodosPrimeraPagina.Enabled = false;
                }
                else
                {
                    bDGVTodosPaginaAnterior.Enabled = true;
                    bDGVTodosPrimeraPagina.Enabled = true;
                }

                if (numeroDePaginaActualTodos == numeroDePaginasMaximoTodos)
                {
                    bDGVTodosPaginaSiguiente.Enabled = false;
                    bDGVTodosUltimaPagina.Enabled = false;
                }
                else
                {
                    bDGVTodosPaginaSiguiente.Enabled = true;
                    bDGVTodosUltimaPagina.Enabled = true;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void CargarDataGridViewSociosInscritos()
        {
            try
            {
                numeroSociosInscritos = int.Parse(torneo.ObtenerNumeroDeSociosInscritos(tbNombreEvento.Text).ToString());
                CargarLabel();

                numeroDePaginasMaximoInscritos = int.Parse(Math.Ceiling(double.Parse(numeroSociosInscritos.ToString()) / numeroDeSociosPorPagina).ToString());

                if (numeroDePaginaActualInscritos == 0)
                    numeroDePaginaActualInscritos = 1;

                if (numeroDePaginaActualInscritos > numeroDePaginasMaximoInscritos)
                    numeroDePaginaActualInscritos = numeroDePaginasMaximoInscritos;

                dsSociosInscritos = torneo.ObtenerSociosInscritosPaginados(tbNombreEvento.Text, numeroDeSociosPorPagina * (numeroDePaginaActualInscritos - 1), numeroDePaginaActualInscritos * numeroDeSociosPorPagina);
                dgvInscritos.DataSource = dsSociosInscritos;
                dgvInscritos.DataMember = "SociosInscritos";
                lblPaginaDGVInscritos.Text = "Página " + numeroDePaginaActualInscritos.ToString() + " de " + numeroDePaginasMaximoInscritos.ToString();

                if (numeroSociosInscritos >= numeroSociosMaximo)
                    bInsertar.Enabled = false;
                else
                    bInsertar.Enabled = true;

                if (numeroSociosInscritos == 0)
                    bEliminar.Enabled = false;
                else
                    bEliminar.Enabled = true;

                if (numeroDePaginaActualInscritos <= 1)
                {
                    bDGVInscritosPaginaAnterior.Enabled = false;
                    bDGVInscritosPrimeraPagina.Enabled = false;
                }
                else
                {
                    bDGVInscritosPaginaAnterior.Enabled = true;
                    bDGVInscritosPrimeraPagina.Enabled = true;
                }

                if (numeroDePaginaActualInscritos == numeroDePaginasMaximoInscritos)
                {
                    bDGVInscritosPaginaSiguiente.Enabled = false;
                    bDGVInscritosUltimaPagina.Enabled = false;
                }
                else
                {
                    bDGVInscritosPaginaSiguiente.Enabled = true;
                    bDGVInscritosUltimaPagina.Enabled = true;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void CargarLabel()
        {
            try
            {
                lblInscritos.Text = "Participantes inscritos: " + numeroSociosInscritos.ToString() + "/" + numeroSociosMaximo.ToString();

                if (numeroSociosInscritos > numeroSociosMaximo)
                    lblInscritos.ForeColor = Color.Red;
                else if (numeroSociosInscritos == numeroSociosMaximo)
                    lblInscritos.ForeColor = Color.Green;
                else
                    lblInscritos.ForeColor = Color.Black;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btMostrarTodos_Click(object sender, EventArgs e)
        {
            try
            {
                MostrarTodos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void MostrarTodos()
        {
            try
            {
                tbNombreSocio.Text = "";
                tbApellidosSocio.Text = "";
                tbDNISocio.Text = "";

                numeroDePaginaActualTodos = 1;

                CargarDataGridViewSociosTodos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void tbNombreSocio_TextChanged(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActualTodos = 1;
                CargarDataGridViewSociosTodos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void tbApellidosSocio_TextChanged(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActualTodos = 1;
                CargarDataGridViewSociosTodos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void tbDNISocio_TextChanged(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActualTodos = 1;
                CargarDataGridViewSociosTodos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bDGVTodosPrimeraPagina_Click(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActualTodos = 1;
                CargarDataGridViewSociosTodos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bDGVTodosPaginaAnterior_Click(object sender, EventArgs e)
        {
            try
            {
                if (numeroDePaginaActualTodos > 1)
                {
                    numeroDePaginaActualTodos--;
                    CargarDataGridViewSociosTodos();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bDGVTodosPaginaSiguiente_Click(object sender, EventArgs e)
        {
            try
            {
                if (numeroDePaginaActualTodos < numeroDePaginasMaximoTodos)
                {
                    numeroDePaginaActualTodos++;
                    CargarDataGridViewSociosTodos();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bDGVTodosUltimaPagina_Click(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActualTodos = numeroDePaginasMaximoTodos;
                CargarDataGridViewSociosTodos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bDGVInscritosPrimeraPagina_Click(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActualInscritos = 1;
                CargarDataGridViewSociosInscritos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bDGVInscritosPaginaAnterior_Click(object sender, EventArgs e)
        {
            try
            {
                if (numeroDePaginaActualInscritos > 1)
                {
                    numeroDePaginaActualInscritos--;
                    CargarDataGridViewSociosInscritos();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bDGVInscritosPaginaSiguiente_Click(object sender, EventArgs e)
        {
            try
            {
                if (numeroDePaginaActualInscritos < numeroDePaginasMaximoInscritos)
                {
                    numeroDePaginaActualInscritos++;
                    CargarDataGridViewSociosInscritos();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bDGVInscritosUltimaPagina_Click(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActualInscritos = numeroDePaginasMaximoInscritos;
                CargarDataGridViewSociosInscritos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public bool RellenarDatosDeTorneo(string nombreTorneo)
        {
            bool resultado = false;

            try
            {
                DataSet datosTorneo = torneo.ObtenerDatosDeTorneo(nombreTorneo);

                if (datosTorneo.Tables["DatosTorneo"].Rows.Count > 0)
                {
                    numeroSociosMaximo = int.Parse(datosTorneo.Tables["DatosTorneo"].Rows[0]["NumeroParticipantes"].ToString());

                    tbNombreEvento.Text = datosTorneo.Tables["DatosTorneo"].Rows[0]["Nombre"].ToString();
                    tbNombreJuego.Text = datosTorneo.Tables["DatosTorneo"].Rows[0]["NombreJuego"].ToString();
                    tbPlataformaJuego.Text = datosTorneo.Tables["DatosTorneo"].Rows[0]["PlataformaJuego"].ToString();
                    dtpFechaInicio.Value = DateTime.Parse(datosTorneo.Tables["DatosTorneo"].Rows[0]["FechaInicio"].ToString());
                    tbGrupos.Text = datosTorneo.Tables["DatosTorneo"].Rows[0]["Grupos"].ToString();
                    tbNumeroParticipantes.Text = datosTorneo.Tables["DatosTorneo"].Rows[0]["NumeroParticipantes"].ToString();
                    tbPrecioInscripcion.Text = datosTorneo.Tables["DatosTorneo"].Rows[0]["Precio"].ToString();

                    MostrarTodos();

                    CargarDataGridViewSociosInscritos();

                    cbMultipleTodos.Checked = false;
                    cbMultipleInscritos.Checked = false;

                    resultado = true;
                }
                else
                {
                    MessageBox.Show("No se han podido cargar todos los datos del torneo.    ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return resultado;
        }

        private void bSalir_Click(object sender, EventArgs e)
        {
            try
            {
                contenedor.hijoFormEventosGestion.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bInsertar_Click(object sender, EventArgs e)
        {
            try
            {
                bool todoBien = true;

                if (dgvTodos.SelectedRows.Count > 0)
                {
                    if (dgvTodos.SelectedRows.Count <= (numeroSociosMaximo - numeroSociosInscritos))
                    {
                        foreach (DataGridViewRow row in dgvTodos.SelectedRows)
                        {
                            if (!torneo.InscribirSocioATorneo(tbNombreEvento.Text, row.Cells["DNI"].Value.ToString()))
                                todoBien = false;
                        }

                        if (!todoBien)
                            MessageBox.Show("Error al inscribir uno o más socios.    ", "Socios no inscritos", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        else
                        {
                            CargarDataGridViewSociosTodos();
                            CargarDataGridViewSociosInscritos();
                        }
                    }
                    else
                    {
                        MessageBox.Show("     No se pueden inscribir los socios seleccionados.\nHa seleccionado " + dgvTodos.SelectedRows.Count.ToString() + " socios y solo hay plazas para " + (numeroSociosMaximo - numeroSociosInscritos).ToString() + " más.", "No hay huecos disponibles", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                else
                {
                    MessageBox.Show("Debe seleccionar un socio para suscribir al torneo.    ", "Selecciona un socio", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                bool todoBien = true;

                if (dgvInscritos.SelectedRows.Count > 0)
                {
                    foreach (DataGridViewRow row in dgvInscritos.SelectedRows)
                    {
                        if (!torneo.BorrarSuscripcionDeSocioATorneo(tbNombreEvento.Text, row.Cells["DNI"].Value.ToString()))
                            todoBien = false;
                    }

                    if (!todoBien)
                        MessageBox.Show("Error eliminando uno o mas socios suscritos.    ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    else
                    {
                        CargarDataGridViewSociosTodos();
                        CargarDataGridViewSociosInscritos();
                    }
                }
                else
                {
                    MessageBox.Show("Debe seleccionar un socio para quitar la suscripción.    ", "Selecciona un socio", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void cbMultipleTodos_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                if (cbMultipleTodos.Checked)
                    dgvTodos.MultiSelect = true;
                else
                    dgvTodos.MultiSelect = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void cbMultipleInscritos_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                if (cbMultipleInscritos.Checked)
                    dgvInscritos.MultiSelect = true;
                else
                    dgvInscritos.MultiSelect = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}
